accessible: Add gtk_accessible_get_platform_state
authorMatthias Clasen <mclasen@redhat.com>
Mon, 12 Oct 2020 23:00:03 +0000 (19:00 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Tue, 13 Oct 2020 01:45:41 +0000 (21:45 -0400)
As a companion to go with the platform_change api,
add a gtk_accessible_get_platform_state() function
that can be used by backends to get the platform
state.

This is in preparation for making entries inherit
their focus states from the text widget within.

gtk/gtkaccessible.c
gtk/gtkaccessibleprivate.h
gtk/gtkatcontextprivate.h
gtk/gtkwidget.c

index 49186ed0ffb080a011bcc0b6935c7b003f37dcdd..6215e032d890509de7746668be5fd9b64c25ddc5 100644 (file)
@@ -643,6 +643,16 @@ gtk_accessible_platform_changed (GtkAccessible               *self,
                                  GtkAccessiblePlatformChange  change)
 {
   GtkATContext *context = gtk_accessible_get_at_context (self);
+
+  /* propagate changes up from ignored widgets */
+  if (gtk_accessible_get_accessible_role (self) == GTK_ACCESSIBLE_ROLE_NONE)
+    {
+      if (gtk_widget_get_parent (GTK_WIDGET (self)) == NULL)
+        return;
+
+      context = gtk_accessible_get_at_context (GTK_ACCESSIBLE (gtk_widget_get_parent (GTK_WIDGET (self))));
+    }
+
   if (context == NULL)
     return;
 
@@ -650,6 +660,13 @@ gtk_accessible_platform_changed (GtkAccessible               *self,
   gtk_at_context_update (context);
 }
 
+gboolean
+gtk_accessible_get_platform_state (GtkAccessible              *self,
+                                   GtkAccessiblePlatformState  state)
+{
+  return GTK_ACCESSIBLE_GET_IFACE (self)->get_platform_state (self, state);
+}
+
 gboolean
 gtk_accessible_should_present (GtkAccessible *self)
 {
index ae4847f39c11410de75b6d1cf918f9a0760bfd0c..4d1f458fb818986700552bb1cd72629da358e2a7 100644 (file)
@@ -30,6 +30,9 @@ struct _GtkAccessibleInterface
   GTypeInterface g_iface;
 
   GtkATContext *        (* get_at_context)      (GtkAccessible *self);
+
+  gboolean              (* get_platform_state)  (GtkAccessible              *self,
+                                                 GtkAccessiblePlatformState  state);
 };
 
 GtkATContext *  gtk_accessible_get_at_context   (GtkAccessible *self);
@@ -37,8 +40,10 @@ GtkATContext *  gtk_accessible_get_at_context   (GtkAccessible *self);
 const char *    gtk_accessible_role_to_name     (GtkAccessibleRole  role,
                                                  const char        *domain);
 
-void            gtk_accessible_platform_changed (GtkAccessible               *self,
-                                                 GtkAccessiblePlatformChange  change);
+void            gtk_accessible_platform_changed (GtkAccessible                *self,
+                                                 GtkAccessiblePlatformChange   change);
+gboolean        gtk_accessible_get_platform_state (GtkAccessible              *self,
+                                                   GtkAccessiblePlatformState  state);
 
 gboolean        gtk_accessible_should_present   (GtkAccessible     *self);
 
index fb396c8cccfb75c8a39718c2efb617e5fb93d8f2..4fec1444c8edad912ef43f330ac68e212efe6ce6 100644 (file)
@@ -81,8 +81,13 @@ typedef enum {
 } GtkAccessibleStateChange;
 
 typedef enum {
-  GTK_ACCESSIBLE_PLATFORM_CHANGE_FOCUSABLE = 1 << 0,
-  GTK_ACCESSIBLE_PLATFORM_CHANGE_FOCUSED   = 1 << 1,
+  GTK_ACCESSIBLE_PLATFORM_STATE_FOCUSABLE,
+  GTK_ACCESSIBLE_PLATFORM_STATE_FOCUSED,
+} GtkAccessiblePlatformState;
+
+typedef enum {
+  GTK_ACCESSIBLE_PLATFORM_CHANGE_FOCUSABLE = 1 << GTK_ACCESSIBLE_PLATFORM_STATE_FOCUSABLE,
+  GTK_ACCESSIBLE_PLATFORM_CHANGE_FOCUSED   = 1 << GTK_ACCESSIBLE_PLATFORM_STATE_FOCUSED,
 } GtkAccessiblePlatformChange;
 
 struct _GtkATContext
index fea2da5c3f037c8bdc0fdda6f38ce8f4181cf640..acaaf9251ad373dc4088752ffeb107a9e2b8609d 100644 (file)
@@ -8124,10 +8124,26 @@ gtk_widget_accessible_get_at_context (GtkAccessible *accessible)
   return priv->at_context;
 }
 
+static gboolean
+gtk_widget_accessible_get_platform_state (GtkAccessible              *self,
+                                          GtkAccessiblePlatformState  state)
+{
+  switch (state)
+    {
+    case GTK_ACCESSIBLE_PLATFORM_STATE_FOCUSABLE:
+      return gtk_widget_get_focusable (GTK_WIDGET (self));
+    case GTK_ACCESSIBLE_PLATFORM_STATE_FOCUSED:
+      return gtk_widget_has_focus (GTK_WIDGET (self));
+    default:
+      g_assert_not_reached ();
+    }
+}
+
 static void
 gtk_widget_accessible_interface_init (GtkAccessibleInterface *iface)
 {
   iface->get_at_context = gtk_widget_accessible_get_at_context;
+  iface->get_platform_state = gtk_widget_accessible_get_platform_state;
 }
 
 /*